// 这个是专门用来创建网络相关信息的

#pragma once
#include "Common.hpp"

#include <cstring>

// 构造函数支持重载
class InteAddr
{
public:
    // 本地网络信息转本地 -- 有网络信息 
    InteAddr(struct sockaddr_in &addr)
        : _addr(addr)
    {
        /////  网络转本地

        // 填充信息
        _addr.sin_family = AF_INET;
        // 网络地址是 4 字节 , 转本地字符串
        // 用 inet_ntop
        char buffer[64];
        socklen_t len = sizeof(_addr);
        inet_ntop(AF_INET, &addr.sin_addr , buffer , len);
        _port = ntohs(_addr.sin_port);
        _ip = buffer; 
    }

    //构建网络信息 -- 有 Ip 和 端口号
    InteAddr(std::string& ip , uint16_t port)
    :_ip(ip)
    ,_port(port)
    {
        // 本地转网络 
        //结构体清0
        bzero(&_addr , sizeof(_addr));
        //填充信息 
        _addr.sin_family = AF_INET;
        //本地转网络
        inet_pton(AF_INET , _ip.c_str() , &_addr.sin_addr);
        _addr.sin_port = htons(_port);
    }



    // 构建网络信息 - 只有端口号
    // 本地转网络  , IP 不关心 , 可以接受任何IP
    InteAddr(uint16_t port)
        : _ip(""), _port(port)
    {
        // 1. 结构体清0
        memset(&_addr, 0, sizeof(_addr));
        // 2. 填充结构体
        _addr.sin_family = AF_INET;
        // IP设置为 0  -- INADDR_ANY
        _addr.sin_addr.s_addr = INADDR_ANY;
        _addr.sin_port = htons(_port);
    }

    std::string GetIp() { return _ip; }

    uint16_t GetPort() { return _port; }

    const struct sockaddr *NetAddrPtr()
    {
        return CONVERT(_addr);
    }
    socklen_t NetAddrLen()
    {
        return sizeof(_addr);
    }
    ~InteAddr() {}

private:
    struct sockaddr_in _addr; // 网络信息结构体
    std::string _ip;          // IP
    uint16_t _port;           // 端口号
};